iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0

Hi,我們已經完成了絕大部份的功能了,今天來針對一些所謂的資訊安全需求來進行強化

error page

在資訊安全上,會有部份安全項目是不可揭露過多資訊、使用檢單的訊息代替完整伺服器錯誤訊息、不可揭露存檔路徑…等,這個項目通常是指若是有出現未處理的例外狀況時,使用統一的錯誤頁面來顯示訊息,在 express 框架中,已經內建該機制了,我們只需要調整 error.ejs 的內容即可

<h1><%= message %></h1>
<h2><%= error.status %></h2>
<!--  拿掉這個部份
<pre><%= error.stack %></pre>
-->

登錄錯誤3次時禁止連線xx 分鐘

這個也是常見需要處理的資安項目,通常我的做法會在登入頁上處理,將錯誤次數紀錄在 localStorage 或 sessionStorage 中,超過規定次數時,設定一個到期期限,每次執行登入時,檢查是否有超過錯誤次數,若沒有超過則放行,有超過則驗證是否還在阻擋期限中

            senddata() {
                //驗證登入錯誤次數與期限
                let errtimes = (localStorage.getItem("errtimes")? localStorage.getItem("errtimes"): 0)
                if(errtimes >= 3) {
                    let now = new Date()
                    let nowtime = now.getTime()
                    let limit = localStorage.getItem("limittime")
                    if(nowtime >= limit) {
                        //超過阻擋時限後,清空紀錄後放行
                        localStorage.removeItem("errtimes")
                        localStorage.removeItem("limittime")
                    } else {
                        //還在阻擋時限中,中止登入作業
                        alert("連續登入錯誤太多次,請稍候重新登入")
                        return false
                    }
                }
                const messageBuffer = new TextEncoder().encode(data.pwd);
                crypto.subtle.digest('SHA-512', messageBuffer)
                    .then(hashBuffer => {
                        const hashArray = Array.from(new Uint8Array(hashBuffer));
                        const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
                        axios.post("/saf/login", {
                            uid: data.uid,
                            pwd: hashHex
                        }).then(function (response) {
                            let rt = response.data
                            if(rt.status == "00") {
                                alert("登入成功")
                                //登入成功後,清除紀錄
                                localStorage.removeItem("errtimes")
                                localStorage.removeItem("limittime")
                                //…
                            } else {
                                //紀錄登入錯誤次數,超過3次時,紀錄有效期限
                                let errtimes = (localStorage.getItem("errtimes")? localStorage.getItem("errtimes"): 0)
                                console.log(errtimes)
                                errtimes++
                                localStorage.setItem("errtimes", errtimes)
                                if (errtimes >= 3) {
                                    let limittime = new Date();
                                    limittime.setMinutes(limittime.getMinutes() + 15)
                                    localStorage.setItem("limittime", limittime.getTime())
                                }
                                alert(rt.msg)
                            }
                        }).catch(function (response) {
                            alert(response.response.data)
                        })
                    })
                    .catch(err => console.error(err));
            }

上述是純前端的控制方式,完整的防護其實可以搭配後端作業,例如說登入帳號從資料庫端進行使用者停用、登入畫面加入驗證碼防止機器人破解等等


上一篇
關於產製pdf報表
下一篇
vue.js 的元件化
系列文
以vue.js + node.js 搭建一個客服填單系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言